home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1997 June
/
EnigmA AMIGA RUN 19 (1997)(G.R. Edizioni)(IT)[!][issue 1997-06][EAR-CD III].iso
/
recent1
/
apic1805.lha
/
APIC
/
examples
/
Amikeyterm.lst
< prev
next >
Wrap
File List
|
1997-05-10
|
21KB
|
547 lines
#PIC V0.9.2 (c)1997 J.Petroglou LIST FILE
#file: data:aminetupp/PICSim/examples/Amikeyterm.src
#date: Sat May 10 15:11:49 1997
#pic : PIC16C84
ADDR CODE SRCLINE SOURCECODE
0000 000001
0000 000002
0000 000003 ;PIC16C84 keybord controller for Amiga keybords
0000 000004 ;pressed keys are located in table and send in serial ascii format (19200baud)
0000 000005 ;
0000 000006 ;Dirk Duesterberg duesterb@unixserv.rz.fh-hannover.de
0000 000007 ; http://linux.rz.fh-hannover.de/~duesterb
0000 000008
0000 000009
0000 000010 list p=PIC16C84, r=dec, s=off
0000 000011
#include 'ram:p16cxx.inc' start
0000 000001 LIST
0000 000002 ; P16CXX.INC Standard PICAsm Header File
0000 000070 LIST
#include end.
0000 000013
0000 000014
0000 000015 #define ACLK PortA,0
0000 000016 #define ADAT PortA,1
0000 000017
0000 000018 #define TXD PortA,2
0000 000019 #define c 3,0
0000 000020 #define z 3,2
0000 000021
0000 000022 RA = 5 ;PortA is register 5
0000 000023
0000 000024
0000 000025
0000 000026
0000 000027 CBLOCK 0ch
0000 000028
0000 000028
0000 000029 count0
0000 000030 count1
0000 000031 Akeydat
0000 000032 serbuf
0000 000033
0000 000033
0000 000034 ENDC
0000 000035
0000 000036
0000 000037
0000 30FB 000038 movlw 11111011b ;pin 2 is output (TXD)
0001 0065 000039 tris PortA
0002 000040
0002 3000 000041 movlw 0 ;PortB is output
0003 0066 000042 tris PortB
0004 000043
0004 2888 000044 goto Reset
0005 000045
0005 000046
0005 000047
0005 080E 000048 rawkeys movf Akeydat,w
0006 397F 000049 andlw 7fh ;clr bit 7 (make/break or pressed/unpressed)
0007 0782 000050 addwf pcl,f
0008 000051
0008 000052
0008 000053 ; characters, numbers and spezial keys
0008 000054 ; $00-$3F
0008 000055
0008 3400 000056 retlw 00h ;00h
0009 3400 000057 retlw 00h ;01h
000A 3400 000058 retlw 00h ;02h
000B 3400 000059 retlw 00h ;03h
000C 3400 000060 retlw 00h ;04h
000D 3400 000061 retlw 00h ;05h
000E 3400 000062 retlw 00h ;06h
000F 3400 000063 retlw 00h ;07h
0010 000064
0010 3400 000065 retlw 00h ;08h
0011 3400 000066 retlw 00h ;09h
0012 3400 000067 retlw 00h ;0Ah
0013 3400 000068 retlw 00h ;0Bh
0014 3400 000069 retlw 00h ;0Ch
0015 3400 000070 retlw 00h ;0Dh
0016 3400 000071 retlw 00h ;0Eh
0017 3400 000072 retlw 00h ;0Fh
0018 000073
0018 000074
0018 000075
0018 3471 000076 retlw "q" ;10h
0019 3477 000077 retlw "w" ;11h
001A 3465 000078 retlw "e" ;12h
001B 3472 000079 retlw "r" ;13h
001C 3474 000080 retlw "t" ;14h
001D 347A 000081 retlw "z" ;15h
001E 3475 000082 retlw "u" ;16h
001F 3469 000083 retlw "i" ;17h
0020 000084
0020 346F 000085 retlw "o" ;18h
0021 3470 000086 retlw "p" ;19h
0022 FFFFFFFC 000087 retlw "ü" ;1Ah
0023 342B 000088 retlw "+" ;1Bh
0024 3400 000089 retlw 00h ;1Ch
0025 3400 000090 retlw 00h ;1Dh
0026 3400 000091 retlw 00h ;1Eh
0027 3400 000092 retlw 00h ;1Fh
0028 000093
0028 000094
0028 000095
0028 3461 000096 retlw "a" ;20h
0029 3473 000097 retlw "s" ;21h
002A 3464 000098 retlw "d" ;22h
002B 3466 000099 retlw "f" ;23h
002C 3467 000100 retlw "g" ;24h
002D 3468 000101 retlw "h" ;25h
002E 346A 000102 retlw "j" ;26h
002F 346B 000103 retlw "k" ;27h
0030 000104
0030 346C 000105 retlw "l" ;28h
0031 FFFFFFF6 000106 retlw "ö" ;29h
0032 FFFFFFE4 000107 retlw "ä" ;2Ah
0033 3400 000108 retlw 00h ;2Bh
0034 3400 000109 retlw 00h ;2Ch
0035 3400 000110 retlw 00h ;2Dh
0036 3400 000111 retlw 00h ;2Eh
0037 3400 000112 retlw 00h ;2Fh
0038 000113
0038 000114
0038 000115
0038 3400 000116 retlw 00h ;30h
0039 3400 000117 retlw 00h ;31h
003A 3400 000118 retlw 00h ;32h
003B 3400 000119 retlw 00h ;33h
003C 3400 000120 retlw 00h ;34h
003D 3400 000121 retlw 00h ;35h
003E 3400 000122 retlw 00h ;36h
003F 3400 000123 retlw 00h ;37h
0040 000124
0040 3400 000125 retlw 00h ;38h
0041 3400 000126 retlw 00h ;39h
0042 3400 000127 retlw 00h ;3Ah
0043 3400 000128 retlw 00h ;3Bh
0044 3400 000129 retlw 00h ;3Ch
0045 3400 000130 retlw 00h ;3Dh
0046 3400 000131 retlw 00h ;3Eh
0047 3400 000132 retlw 00h ;3Fh
0048 000133
0048 000134 ; other spezial keys (space, TAB, Return)
0048 000135 ; $40-$4F
0048 000136
0048 3400 000137 retlw 00h ;40h
0049 3400 000138 retlw 00h ;41h
004A 3400 000139 retlw 00h ;42h
004B 3400 000140 retlw 00h ;43h
004C 3400 000141 retlw 00h ;44h
004D 3400 000142 retlw 00h ;45h
004E 3400 000143 retlw 00h ;46h
004F 3400 000144 retlw 00h ;47h
0050 000145
0050 3400 000146 retlw 00h ;48h
0051 3400 000147 retlw 00h ;49h
0052 3400 000148 retlw 00h ;4Ah
0053 3400 000149 retlw 00h ;4Bh
0054 3400 000150 retlw 00h ;4Ch
0055 3400 000151 retlw 00h ;4Dh
0056 3400 000152 retlw 00h ;4Eh
0057 3400 000153 retlw 00h ;4Fh
0058 000154
0058 000155
0058 000156 ; Function keys, Help etc.
0058 000157 ; $50-$5F
0058 000158
0058 3400 000159 retlw 00h ;50h
0059 3400 000160 retlw 00h ;51h
005A 3400 000161 retlw 00h ;52h
005B 3400 000162 retlw 00h ;53h
005C 3400 000163 retlw 00h ;54h
005D 3400 000164 retlw 00h ;55h
005E 3400 000165 retlw 00h ;56h
005F 3400 000166 retlw 00h ;57h
0060 000167
0060 3400 000168 retlw 00h ;58h
0061 3400 000169 retlw 00h ;59h
0062 3400 000170 retlw 00h ;5Ah
0063 3400 000171 retlw 00h ;5Bh
0064 3400 000172 retlw 00h ;5Ch
0065 3400 000173 retlw 00h ;5Dh
0066 3400 000174 retlw 00h ;5Eh
0067 3400 000175 retlw 00h ;5Fh
0068 000176
0068 000177
0068 000178
0068 000179 ; shifting keys like shift, amiga, Alternate and Control
0068 000180 ; $60-6F
0068 000181
0068 3400 000182 retlw 00h ;60h
0069 3400 000183 retlw 00h ;61h
006A 3400 000184 retlw 00h ;62h
006B 3400 000185 retlw 00h ;63h
006C 3400 000186 retlw 00h ;64h
006D 3400 000187 retlw 00h ;65h
006E 3400 000188 retlw 00h ;66h
006F 3400 000189 retlw 00h ;67h
0070 000190
0070 3400 000191 retlw 00h ;68h
0071 3400 000192 retlw 00h ;69h
0072 3400 000193 retlw 00h ;6Ah
0073 3400 000194 retlw 00h ;6Bh
0074 3400 000195 retlw 00h ;6Ch
0075 3400 000196 retlw 00h ;6Dh
0076 3400 000197 retlw 00h ;6Eh
0077 3400 000198 retlw 00h ;6Fh
0078 000199
0078 000200
0078 000201 ;spezial keybord commandos
0078 000202 ; $70-$7F
0078 000203
0078 3400 000204 retlw 00h ;70h
0079 3400 000205 retlw 00h ;71h
007A 3400 000206 retlw 00h ;72h
007B 3400 000207 retlw 00h ;73h
007C 3400 000208 retlw 00h ;74h
007D 3400 000209 retlw 00h ;75h
007E 3400 000210 retlw 00h ;76h
007F 3400 000211 retlw 00h ;77h
0080 000212
0080 3400 000213 retlw 00h ;78h
0081 3400 000214 retlw 00h ;79h=F9h= letzter tasten code war fehlerhaft
0082 3400 000215 retlw 00h ;7Ah=FAh= tastenpuffer im keybord voll
0083 3400 000216 retlw 00h ;7Bh
0084 3400 000217 retlw 00h ;7Ch=FCh= selbsttest der tastatur war fehlerhaft
0085 3400 000218 retlw 00h ;7Dh=FDh= beginn der beim Einschalten gedrueckten Tasten
0086 3400 000219 retlw 00h ;7Eh=FEh= ende der beim Einschalten gedrueckten Tasten
0087 3400 000220 retlw 00h ;7Fh
0088 000221
0088 000222
0088 000223
0088 000224
0088 000225
0088 000226
0088 000227
0088 000228
0088 000229
0088 000230
0088 000231
0088 000232
0088 000233
0088 000234
0088 000235
0088 000236
0088 000237
0088 000238
0088 000239
0088 000240
0088 000241
0088 000242
0088 000243
0088 000244
0088 018E 000245 Reset clrf Akeydat ;Akeydat is used as character counter
0089 000246
0089 300B 000247 check movlw 11
008A 020E 000248 subwf Akeydat,w ;how many characters ?
008B 1903 000249 btfsc z
008C 289F 000250 goto ready
008D 000251
008D 2092 000252 call dat
008E 008F 000253 movwf serbuf
008F 20D6 000254 call sendb ;send letter
0090 0A8E 000255 incf Akeydat,f
0091 2889 000256 goto check
0092 000257
0092 000258
0092 000259
0092 080E 000260 dat movf Akeydat,w ;letter to w routine
0093 0782 000261 addwf pcl,f ;jump in table
0094 346D 000262 retlw "mache RESET"
0095 3461 000262
0096 3463 000262
0097 3468 000262
0098 3465 000262
0099 3420 000262
009A 3452 000262
009B 3445 000262
009C 3453 000262
009D 3445 000262
009E 3454 000262
009F 000263
009F 000264
009F 000265
009F 000266
009F 000267
009F 000268
009F 000269
009F 20B2 000270 ready call sync
00A0 000271
00A0 000272
00A0 000273
00A0 000274
00A0 3007 000275 rcAdat movlw 7
00A1 008C 000276 movwf count0
00A2 000277
00A2 20CD 000278 :loop call wACLK ;wait for Amiga CLK
00A3 0D8E 000279 rlf Akeydat,f ;rotate bits into register
00A4 0B8C 000280 decfsz count0,f
00A5 28A2 000281 goto :loop ;format is x6543210
00A6 000282
00A6 000283
00A6 0D8E 000284 rlf Akeydat,f ;format is 6543210x
00A7 20CD 000285 call wACLK ;wait for Amiga CLK
00A8 0C8E 000286 rrf Akeydat,f ;format is 76543210, jippije
00A9 098E 000287 comf Akeydat,f ;data is inverted
00AA 000288
00AA 3005 000289 movlw 5
00AB 20BA 000290 call wms ;wait 5 ms
00AC 000291
00AC 000292 ; mov serbuf,Akeydat
00AC 000293 ; call sendb ;send raw data
00AC 000294
00AC 000295
00AC 2005 000296 call rawkeys
00AD 008F 000297 movwf serbuf
00AE 000298
00AE 1F8E 000299 btfss Akeydat,7 ;no sending if key up flag is set
00AF 20D6 000300 call sendb ;send the in table found code
00B0 000301
00B0 20C3 000302 call AHshake ;all data OK, do the Handshake
00B1 28A0 000303 goto rcAdat ;receive next byte from keybord
00B2 000304
00B2 000305
00B2 000306
00B2 000307
00B2 000308
00B2 000309
00B2 000310
00B2 000311
00B2 000312
00B2 000313
00B2 000314
00B2 20CD 000315 sync call wACLK ;wait for clock and do no Acknowledge
00B3 000316
00B3 30FA 000317 movlw 250
00B4 20BA 000318 call wms ;wait 250 ms (we want the sync mode!)
00B5 000319
00B5 20CD 000320 call wACLK ;wait for Amiga CLK for Handshake
00B6 000321
00B6 3001 000322 movlw 1
00B7 20BA 000323 call wms ;wait 1 ms
00B8 000324
00B8 20C3 000325 call AHshake ;now we do the shake!
00B9 0008 000326 return
00BA 000327
00BA 000328
00BA 000329
00BA 000330
00BA 000331
00BA 000332
00BA 008C 000333 wms movwf count0
00BB 000334
00BB 30F8 000335 :loop movlw 248
00BC 008D 000336 movwf count1
00BD 0000 000337 :do_it nop
00BE 000338
00BE 0B8D 000339 decfsz count1,f
00BF 28BD 000340 goto :do_it
00C0 000341
00C0 0B8C 000342 decfsz count0,f
00C1 28BB 000343 goto :loop
00C2 000344
00C2 0008 000345 return
00C3 000346
00C3 000347
00C3 000348
00C3 000349
00C3 000350
00C3 000351
00C3 30F9 000352 AHshake movlw 11111001b ;bit1 = ADAT = output
00C4 0065 000353 tris RA
00C5 000354
00C5 1085 000355 bcf ADAT ;clr Amiga data line
00C6 000356
00C6 3028 000357 movlw 40
00C7 008C 000358 movwf count0 ;40 * 3 = 120cycles = 120 µs (min 75µs)
00C8 0B8C 000359 :do_it decfsz count0,f
00C9 28C8 000360 goto :do_it
00CA 000361
00CA 30FB 000362 movlw 11111011b ;bit1 = ADAT = input
00CB 0065 000363 tris RA
00CC 0008 000364 return
00CD 000365
00CD 000366
00CD 000367
00CD 000368
00CD 000369
00CD 000370
00CD 1805 000371 wACLK btfsc ACLK ;wait for neg clock pulse
00CE 28CD 000372 goto wACLK
00CF 000373
00CF 1C85 000374 btfss Adat
00D0 1003 000375 bcf c
00D1 1885 000376 btfsc Adat
00D2 1403 000377 bsf c ;mov the data to carry bit
00D3 000378
00D3 1C05 000379 wACLK2 btfss ACLK ;wait for pos clock pulse
00D4 28D3 000380 goto wACLK2
00D5 0008 000381 return
00D6 000382
00D6 000383
00D6 000384
00D6 000385
00D6 000386
00D6 000387
00D6 000388
00D6 20E7 000389 sendb call wbit ;this are stop bits from previous sending
00D7 20E7 000390 call wbit
00D8 000391
00D8 1505 000392 bsf TXD ;send startbit
00D9 3008 000393 movlw 8
00DA 008C 000394 movwf count0 ;8 bits to send
00DB 098F 000395 comf serbuf,f ;invert serbuf
00DC 000396
00DC 20E7 000397 s_it call wbit
00DD 0C8F 000398 rrf serbuf,f
00DE 000399
00DE 1C03 000400 btfss c
00DF 1105 000401 bcf TXD
00E0 1803 000402 btfsc c
00E1 1505 000403 bsf TXD
00E2 000404
00E2 0B8C 000405 decfsz count0,f
00E3 28DC 000406 goto s_it ;all bits send ? decrement the bitcounter
00E4 000407
00E4 20E7 000408 call wbit
00E5 1105 000409 bcf TXD ;clear TXD, stopbit, lenght is defined by
00E6 000410 ;next sending
00E6 0008 000411 return
00E7 000412
00E7 000413
00E7 000414
00E7 000415
00E7 000416
00E7 300D 000417 wbit movlw 13
00E8 008D 000418 movwf count1 ;19200 at 4 Mhz
00E9 0B8D 000419 :loop decfsz count1,f
00EA 28E9 000420 goto :loop
00EB 0000 000421 nop
00EC 0008 000422 return
00ED 000423
Used Symbols
-----------------------------------------
W 00000000
F 00000001
INDF 00000000
TMR0 00000001
PCL 00000002
STATUS 00000003
FSR 00000004
PORTA 00000005
PORTB 00000006
PCLATH 0000000A
INTCON 0000000B
OPTION_REG 00000081
TRISA 00000085
TRISB 00000086
GIE 00000007
T0IE 00000005
INTE 00000004
RBIE 00000003
T0IF 00000002
INTF 00000001
RBIF 00000000
NOT_RBPU 00000007
INTEDG 00000006
T0CS 00000005
T0SE 00000004
PSA 00000003
PS2 00000002
PS1 00000001
PS0 00000000
IRP 00000007
RP1 00000006
RP0 00000005
NOT_TO 00000004
NOT_PD 00000003
Z 00000002
DC 00000001
C 00000000
EEDATA 00000008
EEADR 00000009
EECON1 00000088
EECON2 00000089
RA 00000005
count0 0000000C
count1 0000000D
Akeydat 0000000E
serbuf 0000000F
rawkeys 00000005
Reset 00000088
check 00000089
dat 00000092
ready 0000009F
rcAdat 000000A0
sync 000000B2
wms 000000BA
AHshake 000000C3
wACLK 000000CD
wACLK2 000000D3
sendb 000000D6
s_it 000000DC
wbit 000000E7
Used Defines
-----------------------------------------
ACLK PortA,0
ADAT PortA,1
TXD PortA,2
c 3,0
z 3,2
PROGRAM MEMORY USAGE TABLE: '-' = not used 'X' = used
0000 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
00C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXX--- ----------------
0100 : ---------------- ---------------- ---------------- ----------------
0140 : ---------------- ---------------- ---------------- ----------------
0180 : ---------------- ---------------- ---------------- ----------------
01C0 : ---------------- ---------------- ---------------- ----------------
0200 : ---------------- ---------------- ---------------- ----------------
0240 : ---------------- ---------------- ---------------- ----------------
0280 : ---------------- ---------------- ---------------- ----------------
02C0 : ---------------- ---------------- ---------------- ----------------
0300 : ---------------- ---------------- ---------------- ----------------
0340 : ---------------- ---------------- ---------------- ----------------
0380 : ---------------- ---------------- ---------------- ----------------
03C0 : ---------------- ---------------- ---------------- ----------------
Program Memory Words Used: 0237
Program Memory Words Free: 0787
Errors: 0